#### Affine层，之前求权和（包含偏置和权重参数），依靠的是numpy包中的dot方法（正向的），现在，我们来考虑和实现它反向
#### X * W 这样的反向是什么样的呢？ 主要抓住 &L/&X 的形状和 X 的形状是一样的，然后dot本质也算是乘法
#### 考虑乘法的反向，抓住这两个关键的点，就可以推导出dot的反向是什么！！！！
import numpy as np


class Affine:
    def __init__(self, W, b):
        self.W = W
        self.b = b
        self.x = None
        self.dW = None  # 这两个也要？，你是不是想存下来，后面用？
        self.db = None  # 这两个也要？，你是不是想存下来，后面用？

    # forward
    def forward(self, x):
        self.x = x
        out = np.dot(x, self.W) + self.b
        return out

    # backward
    def backward(self, dout):
        dx = np.dot(dout, self.W.T)  # 多想想
        self.dW = np.dot(self.x.T, dout)  # 多想想
        self.db = np.sum(dout, axis=0)  # 这个是真没想明白
        return dx
        